import time

import openpyxl
from common import dir_config as dir
from openpyxl.styles import Font,PatternFill,colors

class Excel_Openrator:

    def __init__(self,filename=dir.excel+'/jpress测试数据.xlsx'):   #默认读取数据的文件，os的获取路劲加拼接
        self.pathfile=filename
        self.wk=openpyxl.load_workbook(filename)  #打开文件

    def get_casedata(self):
        values=[]
        sheetsname=self.get_casename()  #下面获取用例总表get_casename下面方法
        self.sheetnames=sheetsname
        for sheetname in self.sheetnames: #循环获取用例sheet
            value=self.get_startcol_ebdcol_value(sheetname)#通过封装的方法get_startcol_ebdcol_value，从登录列表第三列开始第六列结束
            valuesdata={}  #创建一个字典
            valuesdata['sheetname']= sheetname  #通过循环的第一个sheet工作表，表的名称添加到字典
            valuesdata['value']=value  #第一个表sheet的测试数据
            values.append(valuesdata)   #巡换一次添加到列表里面
        return values  #返回列表加载的数据

    def get_casename(self):
        sheet=self.wk['用例汇总表']#获取用例的工作表
        casesname=[]
        for row in range(2,sheet.max_row+1): #用例汇总表，从第二行开始循环，到最后一行
            # 二行开始到结束，获取行数
            isexecute=sheet.cell(row,5).value#获取用例汇总表第五列是否执行Y
            if isexecute=='y':
                casename=sheet.cell(row,2).value#获取用例汇总表第2列数据，用例名称列允许被执行的用例。
                casesname.append(casename)
        return casesname     #返回要执行用例的列表


    def get_startcol_ebdcol_value(self,sheetname,start=3,end=6): #用例列表获取数据方法
        #获取工作表
        sheet=self.wk[sheetname]
        values=[]

        for row in range(2,sheet.max_row+1):#获取最大行
            stepdata=[]
            for col in range(start,end+1):#从登录sheet，第三列开始执行到第7列结束，关键字到操作值
               value1= sheet.cell(row,col).value #获取每一行，3到7列之间的数据
               if value1!=None:  #当数据不为空
                  stepdata.append(value1)#添加数据到列表里面
            values.append(stepdata)#将每次循环的数据列表添加到新列表，
        ste = [x for x in values if x]  # 去除循环空列表导致关键字报错
        return ste

    def write_step_result(self,sheetname,row,clo,result):
        '''写入测试步骤的结果'''
        caseshett=self.wk[sheetname]  #获取工作表
        caseshett.cell(row,clo).value=result #将指定的行和列对应的位置换成成对应期望的值，
        #颜色填充
        redfall=PatternFill('solid',fgColor='00FF0000') #二进制的颜色，solid，加粗，红色
        redfall2=PatternFill('solid',fgColor='0000FF00')#绿色
        if result == "FALSE":   #判断结果列是不是FALSE
            caseshett.cell(row,clo).fill=redfall  #指定位置换成红色
        else:
            caseshett.cell(row, clo).fill = redfall2 #指定位置换成绿色
        self.wk.save(self.pathfile)  # 最后在保存工作表


    def write_case_result(self,sheetname='用例汇总表',col=7):
        redfall = PatternFill('solid', fgColor='00FF0000')
        redfall2 = PatternFill('solid', fgColor='0000FF00')
        #获取测试用例的执行结果
        sheet=self.wk[sheetname]  #代开指定的工作表
        for  row in range(2,sheet.max_row+1):#循环汇总表的每一行
            isExecute=sheet.cell(row,5).value#5代表是否执行列
            if isExecute== 'y':
                casename=sheet.cell(row, 2).value#2代表测试用例名称的第二列
                stepresult =self.get_sheet_col_values(casename)  #查询
                if 'FALSE' in stepresult:  #通过查看用例表里面是否有FALSE
                    sheet.cell(row, col).fill=redfall   #然后就绿色
                    sheet.cell(row,col).value='FALSE'    #然后写入FALSE
                else:
                    sheet.cell(row, col).fill = redfall2
                    sheet.cell(row, col).value = 'PASS'
                self.wk.save(self.pathfile)  #最后在保存工作表



    def get_sheet_col_values(self,sheetname):
        '获取摸个工作表某列的所有数据'
        values=[]
        sheet=self.wk[sheetname]
        for row in range(2,sheet.max_row+1):  #从第二行开始循环
            stepresult=sheet.cell(row,8).value#8,代表每行关键字用例的执行结果。
            values.append(stepresult)
        return values

    def writet_step_time(self,sheetname,row,loc=7):#loc指的是执行时间的列
        sheet=self.wk[sheetname]
        current_time=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) #格式化当前时间
        sheet.cell(row,loc).value=current_time  #写入工作时间
        self.wk.save(self.pathfile)






if __name__ == '__main__':
    print(Excel_Openrator().get_startcol_ebdcol_value('登录密码为空'))







